import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;

/**
 * @auther yangdong
 * @create 2020-05-09
 * 一方面， 面向对象语言对事物的体现都是以对象的形式，为了方便对多个对象
 * 的操作，就要对对象进行存储。另一方面，使用Array存储对象方面具有一些弊
 * 端，而Java 集合就像一种容器，可以动态地把多个对象的引用放入容器中。
 * 数组在内存存储方面的特点：
 * 数组初始化以后，长度就确定了。
 * 数组声明的类型，就决定了进行元素初始化时的类型
 * 数组在存储数据方面的弊端：
 * 数组初始化以后，长度就不可变了，不便于扩展
 * 数组中提供的属性和方法少，不便于进行添加、删除、插入等操作，且效率不高。
 * 同时无法直接获取存储元素的个数
 * 数组存储的数据是有序的、可以重复的。---->存储数据的特点单一
 * Java 集合类可以用于存储数量不等的多个对象，还可用于保存具有映射关系的
 * 关联数组。
 *
 * Java 集合可分为 Collection 和 Map 两种体系
 * Collection接口：单列数据，定义了存取一组对象的方法的集合
 * List：元素有序、可重复的集合
 * Set：元素无序、不可重复的集合
 *  Map接口：双列数据，保存具有映射关系“key-value对”的集合
 *
 *Collection 接口是 List、Set 和 Queue 接口的父接口，该接口里定义的方法
 * 既可用于操作 Set 集合，也可用于操作 List 和 Queue 集合。
 * JDK不提供此接口的任何直接实现，而是提供更具体的子接口(如：Set和List)
 * 实现。
 * 在 Java5 之前，Java 集合会丢失容器中所有对象的数据类型，把所有对象都
 * 当成 Object 类型处理；从 JDK 5.0 增加了泛型以后，Java 集合可以记住容
 * 器中对象的数据类型。
 *
 * 1、添加
 *  add(Object obj)
 *  addAll(Collection coll)
 * 2、获取有效元素的个数
 *  int size()
 * 3、清空集合
 *  void clear()
 * 4、是否是空集合
 *  boolean isEmpty()
 * 5、是否包含某个元素
 *  boolean contains(Object obj)：是通过元素的equals方法来判断是否
 * 是同一个对象
 *  boolean containsAll(Collection c)：也是调用元素的equals方法来比
 * 较的。拿两个集合的元素挨个比较。
 *
 * 6、删除
 *  boolean remove(Object obj) ：通过元素的equals方法判断是否是
 * 要删除的那个元素。只会删除找到的第一个元素
 *  boolean removeAll(Collection coll)：取当前集合的差集
 * 7、取两个集合的交集
 *  boolean retainAll(Collection c)：把交集的结果存在当前集合中，不
 * 影响c
 * 8、集合是否相等
 *  boolean equals(Object obj)
 * 9、转成对象数组
 *  Object[] toArray()
 * 10、获取集合对象的哈希值
 *  hashCode()
 * 11、遍历
 *  iterator()：返回迭代器对象，用于集合遍历
 */
public class CollectionTest {

    static Persion p1 = new Persion();

    public static void main(String[] args) {
        Collection col = new ArrayList();
        Collection col1 = new ArrayList();
        Persion p = null;
        for (int i = 10; i < 20; i++) {
            p = new Persion(i);
            col.add(p);
        }
        for (int i = 0; i < 10; i++) {
            p1.setAge(i);
            col1.add(p1);
        }
        col.add(11);
        col.add(12);
        col.add("tom");
        col1.add(11);
        col1.add(12);
        /**
         *boolean containsAll(Collection c)：也是调用元素的equals方法来比较的。拿两个集合的元素挨个比较。
         */
        System.out.println(col.containsAll(col1));
        /**
         *  boolean retainAll(Collection c)：把交集的结果存在当前集合中，不影响c
         */
        col.retainAll(Arrays.asList(11, 12));
        System.out.println(col);
        /**
         *  boolean retainAll(Collection c)：把交集的结果存在当前集合中，不影响c
         */
        col.removeAll(col1);
        System.out.println(col.toString());
        System.out.println(col1.toString());
        /**
         * Object[] toArray()转成对象数组
         */
        Object[] oArray = col1.toArray();
        for (Object o : oArray) {
            System.out.println(o.toString());
        }
        /**
         * Arrays.asList(数组)，数组转集合
         */
        col = Arrays.asList(oArray);

        System.out.println(col);
        /**
         * Iterator对象称为迭代器(设计模式的一种)，主要用于遍历 Collection 集合中的元素。
         *  GOF给迭代器模式的定义为：提供一种方法访问一个容器(container)对象中各个元
         * 素，而又不需暴露该对象的内部细节。迭代器模式，就是为容器而生。类似于“公
         * 交车上的售票员”、“火车上的检票员”。
         *  Collection接口继承了java.lang.Iterable接口，该接口有一个iterator()方法，那么所
         * 有实现了Collection接口的集合类都有一个iterator()方法，用以返回一个实现了
         * Iterator接口的对象。
         *  Iterator 仅用于遍历集合，Iterator 本身并不提供承装对象的能力。如果需要创建
         * Iterator 对象，则必须有一个被迭代的集合。
         *  集合对象每次调用iterator()方法都得到一个全新的迭代器对象，默认游标都在集合
         * 的第一个元素之前。
         *
         * 在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用，且
         * 下一条记录无效，直接调用it.next()会抛出NoSuchElementException异常。
         *
         *  Iterator可以删除集合的元素，但是是遍历过程中通过迭代器对象的remove方
         * 法，不是集合对象的remove方法。
         *  如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法，
         * 再调用remove都会报IllegalStateException。
         */
        Iterator iter = col.iterator();
        while (iter.hasNext()) {
            Object obj = iter.next();
            if (obj.equals("tom")) {
                iter.remove();
            }

        }
        iter=col.iterator();
        while (iter.hasNext()) {
            Object obj = iter.next();
            System.out.println(obj+"2");

        }


    }
}
class Persion{
    String name="lily";
    int age=10;
    Persion(){

    }
    Persion(int age){
        this.age=age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Persion{" +
                "age=" + age +
                '}';
    }
}
